Most networks are built on a best-effort model where network elements treat all packets as independent and equal and are serviced on a first-in-first-out (FIFO) basis. The best-effort model does not provide any form of traffic isolation inside the network and network resources are completely shared by all users. As a result, some network users may try to use as many network resources as possible. A network operating in this way can become unstable and can suffer congestion collapse.
To avoid congestion collapse most data sources use TCP congestion control mechanisms which cause them to reduce packet sending rate when congestion occurs. When a resource within the network becomes overloaded, one or more packets are lost and the loss of a packet is taken as an indication of congestion. The destination informs the source of this congestion, and the source slows down. The source then gradually increases its sending rate until it again receives an indication of congestion. This cycle of increasing and decreasing the sending rate serves to probe and utilize whatever bandwidth is available, and to share it between different packet flows.
Effectively, data sources cooperate with the network element to share available bandwidth. However, such dependence on the cooperation of the sources is becoming increasingly unrealistic. Inevitably, some users start to exploit the weakness of the best-effort model to gain more resources. For example, web browsers sometimes establish multiple TCP connections to gain a greater share of the bandwidth of a network element.
The best-effort model also prevents networks from meeting the different needs of users since it is difficult to allocate more resources to those who are willing to pay more. These observations have motivated work on various mechanisms that might be implemented within the network itself to restrict the bandwidth of flows and to discriminate between services that are provided to different users.
Thus, it has been recognized that the needs of users of a data network are not the same and that current networks which provide the same service to all users are not optimal. Traditionally, many networks aim to provide a small number of service classes (typically two or three) with defined quality and prices. This is usually implemented by using multiple queues (one per class) in most elements of the network. In some cases the price being paid for a given service normally does not depend on the congestion state of the network, rather, network services are normally fixed for a given price. The network service provider usually has to make sure that there is always enough bandwidth capacity available to provide the agreed upon level of service. Per-class traffic scheduling can facilitate allocating bandwidth fairly among backlogged traffic classes and can provide low queuing delays. However, for TCP, fair bandwidth allocation through scheduling does not necessarily result in fair bandwidth usage in a class.
Thus, there is a need to provide for allocation of available bandwidth based on parameters associated with the different classes of data packets.